﻿#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

const int N = 1010;

int f[N][N] = { 0 };
string s;
int n;

int main()
{
	cin >> s;
	n = s.size();
	
	s = " " + s;

	for (int len = 1; len <= n; len++)
	{
		for (int i = 1; i + len - 1 <= n; i++)
		{
			int j = i + len - 1;
			if (s[i] == s[j])
			{
				f[i][j] = f[i + 1][j - 1];
			}
			else
			{
				f[i][j] = min(f[i + 1][j], f[i][j - 1]) + 1;
			} 
		}
	}

	cout << f[1][n] << endl;
	return 0;
}


//P1880 [NOI1995] 石子合并

//
//#include <iostream>
//#include <cstring>
//using namespace std;
//
//const int N = 210;
//
//int n, m;
//int s[N] = { 0 };
//int f[N][N] = { 0 }; // 最⼩得分 
//int g[N][N] = { 0 }; // 最⼤得分 
//
//int main()
//{
//	cin >> n;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> s[i];
//		// 倍增 
//		s[i + n] = s[i];
//	}
//
//	m = n + n;
//
//	// 前缀和 
//	for (int i = 1; i <= m; i++)
//	{
//		s[i] += s[i - 1];
//	}
//
//
//	// 初始化 
//	memset(f, 0x3f, sizeof f);
//	memset(g, -0x3f, sizeof g);
//
//	for (int i = 1; i <= m; i++)
//	{
//		f[i][i] = g[i][i] = 0;
//	}
//
//	for (int len = 1; len <= n; len++)
//	{
//		for (int i = 1; i + len - 1 <= m; i++)
//		{
//			int j = i + len - 1;
//			int t = s[j] - s[i - 1];
//			// 枚举分割点 
//			for (int k = i; k < j; k++)
//			{
//				// [i, k] [k + 1][j]
//				f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j] + t);
//				g[i][j] = max(g[i][j], g[i][k] + g[k + 1][j] + t);
//			}
//		}
//	}
//	// 更新结果 
//	int ret1 = 0x3f3f3f3f;
//	int ret2 = -0x3f3f3f3f;
//
//	for (int i = 1; i <= n; i++)
//	{
//		ret1 = min(ret1, f[i][i + n - 1]);
//		ret2 = max(ret2, g[i][i + n - 1]);
//	}
//
//	cout << ret1 << endl << ret2 << endl;
//	return 0;
//}


//P3146 [USACO16OPEN] 248 G


//#include <iostream>
//using namespace std;
//
//const int N = 255;
//
//int n;
//int a[N] = { 0 };
//int f[N][N] = { 0 };
//
//int main()
//{
//	cin >> n;
//	int ret = 0;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> a[i];
//		f[i][i] = a[i];
//		ret = max(ret, a[i]);
//	}
//
//	for (int len = 2; len <= n; len++)
//	{
//		for (int i = 1; i + len - 1 <= n; i++)
//		{
//			int j = i + len - 1;
//			// 枚举分割点 
//			for (int k = i; k < j; k++)
//			{
//				// [i, k] [k + 1, j]
//				if (f[i][k] && f[i][k] == f[k + 1][j])
//				{
//					f[i][j] = max(f[i][j], f[i][k] + 1);
//				}
//			}
//			// 更新结果 
//			ret = max(ret, f[i][j]);
//		}
//	}
//
//	cout << ret << endl;
//	return 0;
//}
